/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package proyecto;

/**
 *
 * @author Luis Romero
 */

public class MemoriaPrincipal {
    
    private class Instruccion{
        public int codigo;
        public int RegDestino;
        public int RegFuente1;
        public int RegFuente2;
    };   
    
    Instruccion Instrucciones[];
    int Datos[];
    int contador;
    boolean espacios[];

    MemoriaPrincipal(){
        contador = 0;
        Instrucciones = new Instruccion[95];
        for(int i = 0; i<95;i++){
            Instrucciones[i]= new Instruccion();
        }
        Datos = new int[832];
        espacios = new boolean[25];
        for(int i=0;i<25;i++){
            espacios[i]=true;
        }
    }
    
    public int iniciarMemoriaInstrucciones(int[] inst){
        Instrucciones[contador/4].codigo = inst[0];
        Instrucciones[contador/4].RegDestino = inst[1];
        Instrucciones[contador/4].RegFuente1 = inst[2];
        Instrucciones[contador/4].RegFuente2 = inst[3];
        contador = contador+4;        
        return contador-4;        
    }
    
   /* public boolean estaOcupado(){
        return ocupado;
    }

    public void toggleOcupado(){
        ocupado = !ocupado;
    }*/

    public int cargarDato(int etiq, int bitP){ 
        int pos = (etiq-96)*2+bitP;
        return Datos[pos];
    }

    public void guardarDato(int dato, int etiq, int bitP){ //DEBE RECIBIR COM PARAMETRO EL BLOQUE A ALMACENAR
        int pos = (etiq-96)*2+bitP;
        Datos[pos]=dato;
    }

    public int[] cargarInstruccion(int etiq){ //NECESITA PARAMETRO DONDE ENVIAR LA INSTRUCCION
        int retorno[] = new int[4];
        retorno[0] = Instrucciones[etiq/4].codigo;
        retorno[1] = Instrucciones[etiq/4].RegDestino;
        retorno[2] = Instrucciones[etiq/4].RegFuente1;
        retorno[3] = Instrucciones[etiq/4].RegFuente2;
        return retorno;
    }

    public int AlmacenarRegistros(Registros R){
        int espacioLibre = getEspacio()+1;
        espacios[espacioLibre-1]=false;
        espacioLibre = 832-(espacioLibre*33);
        for(int i=0;i<33;i++){
            Datos[espacioLibre+i]=R.Registros[i];
        }
        return espacioLibre;
    }

    public void RecuperaRegistros(Registros R,int posInicio){
        for(int i=0;i<33;i++){
            R.Registros[i]=Datos[posInicio+i];
        }
        int mio = (832-posInicio)/33;
        espacios[mio-1]=true;
    }

    private int getEspacio(){
        int posicionLibre=0;
        while(!espacios[posicionLibre]){
            posicionLibre++;
        }
        return posicionLibre;
    }



}
